from django.conf import settings
from django.core.files.storage import Storage
# from django.utils.deconstruct import deconstructible
from fdfs_client.client import Fdfs_client


class FastDFSStorage(Storage):
    """自定义Django文件存储系统"""

    def __init__(self, client_conf=None, base_url=None):
        self.client_conf = client_conf or settings.FDFS_CLIENT_CONF
        self.base_url = base_url or settings.FDFS_BASE_URL

    def _open(self, name, mode='rb'):
        """打开文件时调用的，目前用不到，但是必须实现，所以pass"""
        pass

    def _save(self, name, content):
        """
        保存文件时调用的
        :param name: 要保存的文件名字
        :param content: 要保存的文件内容
        :return: 文件在fdfs唯一标识（file_id）
        """
        client = Fdfs_client(self.client_conf)
        ret = client.upload_by_buffer(content.read())
        # 判断上传是否成功
        if ret.get('Status') != 'Upload successed.':
            raise Exception('fastfds upload failed')

        # 返回结果
        file_id = ret.get('Remote file_id')
        return file_id

    def exists(self, name):
        """判断文件是否存在时调用的，返回Fasle告诉Django每次都是新的文件"""
        return False

    def url(self, name):
        """返回文件全路径"""
        return self.base_url + name
